﻿/*
 * Created by SharpDevelop.
 * User: Usuario
 * Date: 13/11/2011
 * Time: 09:57 p.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Drawing;
using System.Windows.Forms;
using Business_Logic;
using Business_Entity;
using System.Collections.Generic;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp;
using System.IO;

namespace PetSoft.GUI.GestRecursos
{
	/// <summary>
	/// Description of GUIReportesGGRR.
	/// </summary>
	public partial class GUIReportesGGRR : Form
	{
		private int fecIni;
		private int fecFin;
		private int tipReport;
		private List<BETienda> listaTienda;
		private List<BEProducto> listaProducto;
		
		public GUIReportesGGRR()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			this.Load += new EventHandler(GUIReportesGGRR_Load);
			this.fFinDTP.MaxDate = DateTime.Now;
			this.fIniDTP.MaxDate = DateTime.Now;
			this.tipReport = 1;//Reporte de Productos por Almacen
			this.fecIniCB.Enabled = false;
			this.fFinCB.Enabled = false;
			this.fecIni = 0;
			this.fecFin = 0;
			this.prodDGV.DoubleClick += new EventHandler(doble_click);
			this.tiendaDGV.DoubleClick += new EventHandler(doble_clickTienda);
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		
		private void doble_click(object sender, EventArgs e){
			int aux = this.prodDGV.CurrentRow.Index;
			if(((bool) this.prodDGV[0, aux].Value) == true){
				this.prodDGV[0, aux].Value = false;
			}
			else{
				this.prodDGV[0, aux].Value = true;
			}
		}
		
		private void doble_clickTienda(object sender, EventArgs e){
			int aux = this.tiendaDGV.CurrentRow.Index;
			if(((bool) this.tiendaDGV[0, aux].Value) == true){
				this.tiendaDGV[0, aux].Value = false;
			}
			else{
				this.tiendaDGV[0, aux].Value = true;
			}
		}
		
		void GUIReportesGGRR_Load(object sender, EventArgs e){
			BLTienda blt = new BLTienda();
			List<BETienda> lista = blt.getAllTiendasFiorella();
			//Carga la lista de Tiendas
			foreach (BETienda t in lista) {
			    this.tiendaDGV.Rows.Add(false, t.Id, t.Nombre);							    
			}
			this.listaTienda = lista;
			
			//Carga la tabla de productos
			BLProducto blp = new BLProducto();
			List<BEProducto> listaP = blp.getProductos();
			BEUnidadProducto u = new BEUnidadProducto();
			BETipoProducto tP = new BETipoProducto();
			foreach (BEProducto p in listaP) {
				this.prodDGV.Rows.Add(false, p.Codigo,p.Nombre);
			}
			this.listaProducto = listaP;
		}
		
		void Button1Click(object sender, EventArgs e)
		{
			try{
			List<BEProductoTienda> listaRep1;
			List<BEMovimientoProducto> listaRep2;
			int codprod=0, codTienda=0;
			String fechaIni, fechaFin;
			List<BETienda> listaTiSel = null;
			List<BEProducto> listaProdSel = null;
			
			//Leemos el DGV  de tienda
			listaTiSel = new List<BETienda>();
			for(int i=0; i<this.tiendaDGV.RowCount;i++){
	           	if((this.tiendaDGV[0,i].Value!=null) && (Convert.ToBoolean(this.tiendaDGV[0,i].Value) == true)){
					int codT = Int32.Parse(this.tiendaDGV[1,i].Value.ToString());
	           		foreach (BETienda t in this.listaTienda) {
						if(t.Id==codT){								
							listaTiSel.Add(t);
							break;
						}
	           		}
	           	}            	
	        }
			
			//ahora leemos el DGV de productos
			listaProdSel = new List<BEProducto>();
			for(int i=0; i<this.prodDGV.RowCount;i++){
	           	if((this.prodDGV[0,i].Value!=null) && (Convert.ToBoolean(this.prodDGV[0,i].Value) == true)){
					int codP = Int32.Parse(this.prodDGV[1,i].Value.ToString());
	           		foreach (BEProducto p in this.listaProducto) {
						if(p.Codigo==codP){								
							listaProdSel.Add(p);
							break;
						}
	           		}
	           	}            	
	        }
				
			//codprod = Int32.Parse(this.prodCB.SelectedValue.ToString());
			//5codTienda = Int32.Parse(this.tiendaCB.SelectedValue.ToString());
			
			if(this.fecIni==1){
	        	fechaIni = String.Format("{0:dd/MM/yyyy}", DateTime.Parse(this.fIniDTP.Value.ToShortDateString()));
			}
	        else
	        	fechaIni = "";
	        
	        //si se selecciona el checkbox de la fecha fin, entonces se considera en la busqueda
	        if(fecFin==1){
	        	fechaFin = String.Format("{0:dd/MM/yyyy}", DateTime.Parse(this.fFinDTP.Value.ToShortDateString()));
	        }
	        else
	        	fechaFin = "";
	        
			BLReporteGGRR rep = new BLReporteGGRR();
			if(this.tipReport==1){//reporte de productos pro tienda
				try {
				listaRep1 = rep.reporteProdXTienda(listaTiSel, listaProdSel);
				//tenemos la lista de los productos que serán incluidos en el reporte
				}
				catch (Exception EX){Utils.MessageAviso(EX.Message) ;}
				//generaReporte1(listaRep1);
			}
			else{//reporte de los movimientos de productos en las tiendas
				listaRep2 = rep.reporteMovimiento(listaProdSel, listaTiSel, fechaIni, fechaFin);
				generaReporte2(listaRep2);
			}
			}
			catch(Exception ex){
				MessageBox.Show(ex.ToString(),"");
			}
		}
		
		void generaReporte2(List<BEMovimientoProducto> lista){
			//Creamos el nuevo documento del reporte
			Document doc = new Document();
			
			//Agregamos un titulo
			doc.AddTitle("Reporte de Movimientos de Productos");
			
			//Creamos un escritor para el documento
			PdfWriter escritor = PdfWriter.GetInstance(doc, new FileStream("..//ReporteMovimiento.pdf", FileMode.Create));
			escritor.ViewerPreferences = PdfWriter.PageModeUseThumbs;
			doc.Open();
			
			//Añadimos el titulo al documento
			Paragraph titulo = new Paragraph("Reporte de Movimiento de Productos", FontFactory.GetFont("dax-black", 24));
			titulo.Alignment = 1;//Centrar el título
			//titulo.ExtraParagraphSpace;
			//titulo.ExtraParagraphSpace;
			doc.Add(titulo);
			
			//Añadimos la primera fecha a analizar
			Paragraph parr;
			DateTime fecha = lista[0].Fecha;
			//El nombre de la primera tienda
			String f = fecha.ToShortDateString();
			parr = new Paragraph("" + f, FontFactory.GetFont("dax-black", 18));
			parr.Alignment = 3;//alineado a la izquierda
			doc.Add(parr);
			PdfPTable tabla = new PdfPTable(4);
			tabla.DefaultCell.HorizontalAlignment = 1;
			tabla.DefaultCell.BorderWidth = 0;
			tabla.DefaultCell.PaddingBottom = 20;
			tabla.AddCell("TIENDA");
			tabla.AddCell("PRODUCTO");
			tabla.AddCell("CANTIDAD");
			tabla.AddCell("MOVIMIENTO");
			doc.Add(tabla);
			
			foreach (BEMovimientoProducto m in lista) {
				if(f!=m.Fecha.ToShortDateString()){//se escribe la nueva fecha
					f = m.Fecha.ToShortDateString();
					parr = new Paragraph("" + f, FontFactory.GetFont("dax-black", 18));
					parr.Alignment = 3;//alineado a la izquierda
					//parr.ExtraParagraphSpace;
					//parr.ExtraParagraphSpace;
					doc.Add(parr);
					tabla = new PdfPTable(4);
					tabla.DefaultCell.HorizontalAlignment = 1;
					tabla.DefaultCell.BorderWidth = 0;
					tabla.DefaultCell.PaddingBottom = 20;
					tabla.AddCell("TIENDA");
					tabla.AddCell("PRODUCTO");
					tabla.AddCell("CANTIDAD");
					tabla.AddCell("MOVIMIENTO");
					doc.Add(tabla);
				}			
				tabla = new PdfPTable(4);
				tabla.DefaultCell.HorizontalAlignment = 1;
				tabla.DefaultCell.BorderWidth = 0;
				tabla.DefaultCell.PaddingBottom = 20;
				tabla.AddCell("" + m.Tienda.Nombre);
				tabla.AddCell("" + m.Producto.Nombre);
				tabla.AddCell("" + m.Cantidad);
				tabla.AddCell("" + m.Tipo.Descripcion);
				doc.Add(tabla);
			}
			doc.Close();
			//Abrimos el documento creado
			System.Diagnostics.Process.Start("AcroRd32.exe","ReporteMovimiento.pdf");
		}
		
		void generaReporte1(List<BEProductoTienda> lista){
			BLProducto blProd = new BLProducto();
			BLTienda blTienda = new BLTienda();
			BEProducto bProd;
			BETienda bTienda;
			
			Document doc = new Document(PageSize.A4);
			
			//Autor del documento
			doc.AddAuthor("PetSoft");
			
			//Agregamos la fecha de creación
			doc.AddCreationDate();
			
			//Agregamos el titulo
			doc.AddTitle("Reporte de Productos por Tienda");
			
			//Creamos un escritor para el documento
			PdfWriter escritor = PdfWriter.GetInstance(doc, new FileStream("..//ReporteProducto.pdf", FileMode.Create));
			escritor.ViewerPreferences = PdfWriter.PageModeUseThumbs;
			doc.Open();
			
			//Añadimos el titulo al documento
			Paragraph titulo = new Paragraph("Reporte de Productos por Tienda", FontFactory.GetFont("dax-black", 24));
			titulo.Alignment = 1;//Centrar el título
			doc.Add(titulo);
			
			//Añadimos los datos pedidos para el reporte
			Paragraph parr;
			int codT = lista[0].Tienda;
			//El nombre de la primera tienda
			bTienda = blTienda.getTiendaByCodFiorella(lista[0].Tienda);
			parr = new Paragraph("" + bTienda.Nombre, FontFactory.GetFont("dax-black", 18));  
			parr.Alignment = 3;//alineado a la izquierda
			doc.Add(parr);
			PdfPTable tabla = new PdfPTable(2);
			tabla.DefaultCell.HorizontalAlignment = 1;
			tabla.DefaultCell.BorderWidth = 0;
			tabla.DefaultCell.PaddingBottom = 20;
			tabla.AddCell("PRODUCTO");
			tabla.AddCell("STOCK ACTUAL");
			doc.Add(tabla);
			
			foreach (BEProductoTienda p in lista) {		
				if(codT!=p.Tienda){//nueva tienda
					codT = p.Tienda;
					//agrega el nombre de la tienda
					bTienda = blTienda.getTiendaByCodFiorella(p.Tienda);
					parr = new Paragraph("" + bTienda.Nombre, FontFactory.GetFont("dax-black", 18));  
					parr.Alignment = 3;//alineado a la izquierda
					doc.Add(parr);
					tabla = new PdfPTable(2);
					tabla.DefaultCell.HorizontalAlignment = 1;
					tabla.DefaultCell.BorderWidth = 0;
					tabla.DefaultCell.PaddingBottom = 20;
					//agrega la cabecera de la tabla
					tabla.AddCell("PRODUCTO");
					tabla.AddCell("STOCK ACTUAL");
					doc.Add(tabla);
				}
				tabla = new PdfPTable(2);
				tabla.DefaultCell.HorizontalAlignment = 1;
				tabla.DefaultCell.BorderWidth = 0;
				List<BEProducto> lP = blProd.getProductoByCod(p.Producto);
				bProd = blProd.getProductoByCod(p.Producto)[0];
				tabla.AddCell(bProd.Nombre);
				tabla.AddCell("" + p.StockActual);					
				doc.Add(tabla);				
			}
			//doc.Add(new Paragraph("Prueba"));
			doc.Close();
			//Abrimos el documento creado
			System.Diagnostics.Process.Start("AcroRd32.exe","ReporteProducto.pdf");
		}
		
		void SalBTNClick(object sender, EventArgs e)
		{
			this.Close();
		}
		
		void FecIniCheckedChanged(object sender, EventArgs e)
		{
			if(this.fecIniCB.Checked==true){
				fecIni = 1;				
				this.fIniDTP.Enabled = true;
			}
			else{
				fecIni = 0;
				this.fIniDTP.Enabled = false;
			}
		}
		
		void FFinCBCheckedChanged(object sender, EventArgs e)
		{
			if(this.fFinCB.Checked==true){
				fecFin = 1;				
				this.fFinDTP.Enabled = true;
			}
			else{
				fecFin = 0;
				this.fFinDTP.Enabled = false;
			}
		}
		
		
		void RadioButton1CheckedChanged(object sender, EventArgs e)
		{
			this.tipReport = 2;
			this.fecIniCB.Enabled = true;
			this.fFinCB.Enabled = true;
		}
		
		void ProdRBTNCheckedChanged(object sender, EventArgs e)
		{
			this.tipReport = 1;
			this.fecIniCB.Enabled = false;
			this.fFinCB.Enabled = false;
			this.fFinDTP.Enabled = false;
			this.fIniDTP.Enabled = false;
		}
		
		void SelAllCBCheckedChanged(object sender, EventArgs e)
		{
			for(int i=0; i<this.tiendaDGV.Rows.Count; i++){
				this.tiendaDGV[0,i].Value = this.selAllCB.Checked;
			}
		}
		
		void SelProdCBCheckedChanged(object sender, EventArgs e)
		{
			for(int i=0; i<this.prodDGV.Rows.Count; i++){
				this.prodDGV[0,i].Value = this.selProdCB.Checked;
			}
		}
		
	}
}
